package parser;

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.naming.OperationNotSupportedException;

public class Field implements Iterable<Line>{

	final public Tag tag;

	/**
	 * Garantiert, dass immer eine Zeile enthalten ist.
	 * 
	 * @param tag nicht null
	 * @param line	nicht null
	 */
	public Field(Tag tag, Line line) {
		if (tag == null || line == null)
			throw new IllegalArgumentException();
		this.tag = tag;
		lines.add(line);
	}

	/**
	 * 
	 * Verkürzter Konstruktor, tag wird aus line entnommen.
	 * Garantiert, dass immer eine Zeile enthalten ist. 
	 * 
	 * @param line	nicht null
	 */
	public Field(Line line) {
		if (line == null)
			throw new IllegalArgumentException();
		this.tag = line.tag;
		lines.add(line);
	}

	private List<Line> lines = new LinkedList<Line>();

	/**
	 * Addiert line oder den Inhalt von Line zum Feld hinzu.
	 * 
	 * @param line nicht null
	 * @throws OperationNotSupportedException Wenn weder line noch der 
	 * Inhalt zum Feld hinzugefügt werden darf.
	 */
	public void add(Line line) throws OperationNotSupportedException {
		if (line == null)
			throw new IllegalArgumentException();
		if (tag.repeatability == Repeatability.REPEATABLE)
			lines.add(line);
		else {
			Line myLine = lines.get(0);
			// hier kann die Ausnahme auftreten:
			myLine.add(line); 
		}

	}

	public List<Line> getLines() {
		return Collections.unmodifiableList(lines);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	@Override
	public Iterator<Line> iterator() {
		return lines.iterator();
	}
	
	@Override
	public String toString() {
		return lines.toString();
	}

}
